package Algorithm.leetcode;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**
 * 请你来实现一个 atoi 函数，使其能将字符串转换成整数。
 *
 * 首先，该函数会根据需要丢弃无用的开头空格字符，直到寻找到第一个非空格的字符为止。
 *
 * 当我们寻找到的第一个非空字符为正或者负号时，则将该符号与之后面尽可能多的连续数字组合起来，作为该整数的正负号；
 *
 * 假如第一个非空字符是数字，则直接将其与之后连续的数字字符组合起来，形成整数。
 *
 * 该字符串除了有效的整数部分之后也可能会存在多余的字符，这些字符可以被忽略，它们对于函数不应该造成影响。
 *
 * 注意：假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时，则你的函数不需要进行转换。
 *
 * 在任何情况下，若函数不能进行有效的转换时，请返回 0。
 *
 * 说明：
 *
 * 假设我们的环境只能存储 32 位大小的有符号整数，那么其数值范围为 [−231,  231 − 1]。
 * 如果数值超过这个范围，请返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。
 *
 */
public class ch0329 {
    private static boolean isNumber(char c){
        return c >= 48 && c <= 57;
    }



//
    public static int myAtoi(String str) {
        char[] cs = str.toCharArray();
        int len=str.length();
        for(int i=0;i<len;){
            if(cs[i]==' '){
                i++;
            }else if(cs[i]=='+'||cs[i]=='-'){
                if(i==len-1){
                    return 0;
                }
                int j=i+1;
                for(;j<len;){
                    if(isNumber(cs[j]))
                        j++;
                    else{
                        if(!isNumber(cs[j-1]))
                            return 0;
                        try {
                            return Integer.parseInt(str.substring(i,j));
                        } catch (NumberFormatException e) {
                            if(cs[i]=='-')
                                return Integer.MIN_VALUE;
                            else
                                return Integer.MAX_VALUE;
                        }
                    }
                }
                try {
                    return Integer.parseInt(str.substring(i,j));
                } catch (NumberFormatException e) {
                    if(cs[i]=='-')
                        return Integer.MIN_VALUE;
                    return Integer.MAX_VALUE;
                }
            }else if(isNumber(cs[i])){
                if(i==cs.length-1){
                    return Integer.parseInt(str.substring(i,i));
                }else{
                    for(int j=i;j<len;j++){
                        if(!isNumber(cs[j])){
                            try {
                                return Integer.parseInt(str.substring(i,j));
                            } catch (NumberFormatException e) {
                                if(cs[i]=='-')
                                    return Integer.MIN_VALUE;
                                return Integer.MAX_VALUE;
                            }
                        }
                    }
                    try {
                        return Integer.parseInt(str.substring(i,len));
                    } catch (NumberFormatException e) {
                        if(cs[i]=='-')
                            return Integer.MIN_VALUE;
                        return Integer.MAX_VALUE;
                    }
                }
            }else{
                return 0;
            }
        }
        return 0;
    }


    public static void main(String[] args) {
        System.out.println(myAtoi("   -42"));
        System.out.println(myAtoi("4193 with words"));
        System.out.println(myAtoi("words and 987"));
        System.out.println(myAtoi("-91283472332"));
        System.out.println(myAtoi("42"));
        System.out.println(myAtoi("3.14"));
        System.out.println(myAtoi("-0012a42"));
        System.out.println(myAtoi("+-2"));

    }
}
